package com.hr.剑指offer.work1;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

/**
 * @author 周恒哲
 * @date 2020/06/17
 * BFS(广度优先遍历)，借助队列来实现
 * 算法流程：
 * 特例处理： 当树的根节点为空，则直接返回空列表 [] ；
 * 初始化： 打印结果列表 res = [] ，包含根节点的队列 queue = [root] ；
 * BFS 循环： 当队列 queue 为空时跳出；
 * 出队： 队首元素出队，记为 node；
 * 打印： 将 node.val 添加至列表 tmp 尾部；
 * 添加子节点： 若 node 的左（右）子节点不为空，则将左（右）子节点加入队列 queue ；
 * 返回值： 返回打印结果列表 res 即可。
 **/
public class 面试题32_I_从上到下打印二叉树 {
    public int[] levelOrder(TreeNode root) {
        if (root==null){
            return new int[0];
        }
        Queue<TreeNode> queue=new LinkedList<>();
        queue.add(root);
        ArrayList<Integer> ans=new ArrayList<>();;
        while (!queue.isEmpty()){
            TreeNode node=queue.poll();//从首位置取元素并删除
            ans.add(node.val);
            if (node.left!=null){
                queue.add(node.left);
            }
            if (node.right!=null){
                queue.add(node.right);
            }
        }
        int[] res=new int[ans.size()];
        for (int i = 0; i < ans.size(); i++) {
            res[i]=ans.get(i);
        }
        return res;
    }
}
